package com.reeygu.item.config;

import com.google.common.base.Predicates;
import com.reeygu.item.annotation.Swagger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

@Configuration
public class SwaggerConfig {

    //swagger的全局配置
    @Bean
    public Docket docket() {
        //指定docket类型
        Docket docket = new Docket(DocumentationType.SWAGGER_2);
        //构建API帮助文档的描述信息
        ApiInfo apiInfo = new ApiInfoBuilder()
                .contact(new Contact("Reey Gu",
                        "http://www.reeygu.com",
                        "a23133201914@163.com"))
                .title("高并发的技术练习项目开发文档")
                .description("描述:这是测试高并发的一些技术案例整合，当然是某些业务的demo联系，并不是一个完整的项目")
                .version("1.1")
                .build();
        //配置文档上下文
        docket.apiInfo(apiInfo);

        docket = docket.select()
                //Predicates规则匹配的工具，可以查看源码了解一些用法
                //not 取反， withMethodAnnotation 方法上是否包含该注解
                .apis(
                        Predicates.not(
                                RequestHandlerSelectors.withMethodAnnotation(Swagger.class)
                        )
                )
                //获取Docket中的选择器，返回ApiSelectorBuilder :扫描什么包下的注解
                .apis(RequestHandlerSelectors.basePackage("com.reeygu.item.controller"))
                //使用正则表达式约束生成API文档的路径, 可在控制类上写 @RequestMapping("/swagger")，没有该路径的不会生成文档
                .paths(
                        //可通过or设置多个
                        Predicates.or(
                                PathSelectors.regex("/swagger/.*"),
                                PathSelectors.regex("/swagger2/.*")
                        )
                )
                .build();
        return docket;
    }
}
